package mvc;
import tp3.*;

import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JPanel;

import mvc.ControladorGps.Pantalla;

@SuppressWarnings("serial")
public class VistaMapa extends JPanel{
	
	private Juego modelo;
	private ControladorGps controlador;
	
	public VistaMapa (final Juego modelo,final ControladorGps elControlador){
		addKeyListener(new KeyListener() {
			private boolean puedeMoverse = true;
					
			@Override
			public void keyTyped(KeyEvent e) {
			}

			@Override
			public void keyReleased(KeyEvent e) {
				puedeMoverse = true;
			}

			@Override
			public void keyPressed(KeyEvent e) {

				if (puedeMoverse & controlador.pantalla == Pantalla.MAPA){
					controlador.keyPressed(e);
					puedeMoverse = false;
										
				}		
			}
		});
		setFocusable(true);
		this.modelo = modelo;
		this.controlador = elControlador;
	}
	
	
	public void paint (Graphics g){

		if(controlador.pantalla == Pantalla.MAPA || controlador.pantalla == Pantalla.JUEGO_TERMINADO){
				super.paint(g);
				Graphics2D g2d = (Graphics2D) g;
				g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
						RenderingHints.VALUE_ANTIALIAS_ON);
				
				pintarMapa(g2d);
		}
		
	}
	
	private void pintarMapa(Graphics2D g2d){

		int alto;
		int ancho;
		
		int margen = 20;
		
		int largoCuadra = 30;
		int anchoCalle = 10;
		int diamAuto = 15;
		int dimSorpObstac = 7;
		int dimBandera = 15;

		//escala
		int escala = largoCuadra + anchoCalle;
		
		//Tamanio del tablero
		alto = modelo.getAlto();
		ancho = modelo.getAncho();

		g2d.setColor(Color.WHITE);
		// x , y
		g2d.fillRect(0,0,1000,1000);
		
		//CUADRAS
		for (int i = 0; i<alto -1; i++){
			g2d.setColor(Color.BLACK);
			for (int j = 0; j<ancho -1; j++){
				//mapea ancho,alto
				g2d.fillRect(j*escala + margen, i*escala + margen, largoCuadra, largoCuadra);
			}
		}	

		
		//OBSTACULO Y SORPRESA
		Obstaculo obstaculo;
		Sorpresa sorpresa;
		int centra;
		
		for (Cuadra cuadra : modelo.getTablero().getCuadras()){  
			float fila = modelo.getTablero().getFilaCuadra(cuadra);
			float columna = modelo.getTablero().getColumnaCuadra(cuadra);
			
			obstaculo = cuadra.getObstaculo();
			sorpresa = cuadra.getSorpresa();
			
			centra = ((obstaculo != null & sorpresa != null) ? 2:0);
				
		    if (obstaculo != null){
		    	if(obstaculo.getClass() == Pozo.class){
		    		g2d.setColor(Color.DARK_GRAY);	
		    	}else if(obstaculo.getClass() == Piquete.class){
		    		g2d.setColor(Color.MAGENTA);
		    	}else if(obstaculo.getClass() == ControlPolicial.class){
		    		g2d.setColor(Color.BLUE);
		    	}
		    
		    	g2d.fillRect((int) (fila*escala - (anchoCalle/2 + dimSorpObstac/2) + margen + centra),(int) (columna*escala  - (anchoCalle/2 + dimSorpObstac/2) + margen + centra), dimSorpObstac, dimSorpObstac);
		    }
		    sorpresa = cuadra.getSorpresa();
		    if (sorpresa != null){
		    	g2d.setColor(Color.ORANGE);	
		    	g2d.fillRect((int) (fila*escala - (anchoCalle/2 + dimSorpObstac/2) + margen - centra),(int)( columna*escala  - (anchoCalle/2 + dimSorpObstac/2) + margen - centra), dimSorpObstac, dimSorpObstac);
		    }
		}
	
		//VEHICULO
    	if (modelo.getVehiculo().getEstado().getClass()== Auto.class){
		g2d.setColor(Color.RED);
    	}else if (modelo.getVehiculo().getEstado().getClass()== Moto.class){
    		g2d.setColor(Color.YELLOW);
    	}else if (modelo.getVehiculo().getEstado().getClass()== Camioneta.class){
    		g2d.setColor(Color.GRAY);
    	}
    	
		g2d.fillOval(modelo.getFilaJugador()*escala - (anchoCalle/2 + diamAuto/2) + margen, modelo.getColumnaJugador()*escala - (anchoCalle/2 + diamAuto/2) + margen, diamAuto,diamAuto );
		
		
		if (controlador.pantalla == Pantalla.MAPA){
			taparMapa(g2d, escala, alto, ancho, anchoCalle, diamAuto, margen);
		}
		
		
		//META
    	g2d.setColor(Color.RED);	
    	g2d.fillRect((int) (modelo.getFilaFinal()*escala - (anchoCalle/2 + dimBandera/2) + margen),(int)( modelo.getColumnaFinal()*escala  - (anchoCalle/2 + dimBandera/2) + margen), dimBandera, dimBandera);			
		
		//TEXTOS
		g2d.setColor(Color.BLACK);
		g2d.drawString("Hola " + modelo.getVehiculo().getJugador().getNombre() + "!!",ancho*escala + margen, margen + 10);
		
		g2d.setColor(Color.RED);
		g2d.drawString("Movimientos: " + String.valueOf(modelo.getVehiculo().getJugador().getMovimientos()),ancho*escala + margen, margen + 35);
		g2d.setColor(Color.BLACK);
		g2d.drawString("Te quedan: " + String.valueOf(modelo.movimientosRestantes()),ancho*escala + margen + 2, margen + 55);
		
		
		//REFERENCIAS
		g2d.setStroke(new BasicStroke(5));
		g2d.setColor(Color.BLACK);
		g2d.drawRect(ancho*escala + margen, margen + 150, 200,250);
		
			g2d.drawString("Referencias:",ancho*escala + margen + 10, margen + 170);
		
			g2d.setColor(Color.RED);
			g2d.fillOval(ancho*escala + margen + 10, margen + 180 + 10, diamAuto,diamAuto );
			g2d.drawString("Auto",ancho*escala + margen + 35, margen + 180 + 22);
			
			g2d.setColor(Color.YELLOW);
			g2d.fillOval(ancho*escala + margen + 10, margen + 180 + 30, diamAuto,diamAuto );
			g2d.drawString("Moto",ancho*escala + margen + 35, margen + 180 + 42);
		
	    	g2d.setColor(Color.GRAY);
	    	g2d.fillOval(ancho*escala + margen + 10, margen + 180 + 50, diamAuto,diamAuto );
			g2d.drawString("4x4",ancho*escala + margen + 35, margen + 180 + 62);
		
			g2d.setColor(Color.RED);	
	    	g2d.fillRect(ancho*escala + margen + 10, margen + 180 + 80, dimBandera, dimBandera);
	    	g2d.drawString("Meta",ancho*escala + margen + 35, margen + 180 + 92);
			

			g2d.setColor(Color.DARK_GRAY);	
	    	g2d.fillRect(ancho*escala + margen + 15, margen + 180 + 115, dimSorpObstac, dimSorpObstac);
	    	g2d.drawString("Pozo",ancho*escala + margen + 35, margen + 180 + 122);
		
			g2d.setColor(Color.MAGENTA);	
	    	g2d.fillRect(ancho*escala + margen + 15, margen + 180 + 135, dimSorpObstac, dimSorpObstac);
	    	g2d.drawString("Piquete",ancho*escala + margen + 35, margen + 180 + 142);
			
	    	g2d.setColor(Color.BLUE);
	    	g2d.fillRect(ancho*escala + margen + 15, margen + 180 + 155, dimSorpObstac, dimSorpObstac);
	    	g2d.drawString("Control Policial",ancho*escala + margen + 35, margen + 180 + 162);
			
	    	g2d.setColor(Color.ORANGE);
	    	g2d.fillRect(ancho*escala + margen + 15, margen + 180 + 185, dimSorpObstac, dimSorpObstac);
	    	g2d.drawString("Sorpresa",ancho*escala + margen + 35, margen + 180 + 192);
			
	    //////////////////////////
	    	
	    if (modelo.gano()){
	    	controlador.pantalla = Pantalla.JUEGO_TERMINADO;
			g2d.setColor(Color.GREEN);
			g2d.fillRect(ancho*escala + margen, margen + 80, 230,60);
			g2d.setColor(Color.BLACK);
			g2d.drawString("GANASTE " + String.valueOf(modelo.getPuntos() + " PUNTOS!!"),ancho*escala + margen + 50, margen + 110);
				
		}else if (modelo.perdio()){
			controlador.pantalla = Pantalla.JUEGO_TERMINADO;
			g2d.setColor(Color.RED);
			g2d.fillRect(ancho*escala + margen, margen + 80, 230,60);
			g2d.setColor(Color.BLACK);
			g2d.drawString("PERDISTE. No hay mas movimientos",ancho*escala + margen + 10, margen + 110);
		}

	}
	
	private void taparMapa(Graphics2D g2d, int escala, int alto, int ancho, int anchoCalle , int diamAuto, int margen){
		//para la parte negraa, que cubre al jugador
		g2d.setStroke(new BasicStroke(21));
		g2d.setColor(Color.BLACK);
		int grosor = 140;
		for (int i = 0; i<80;i++){
			
		g2d.drawOval(modelo.getFilaJugador()*escala - (anchoCalle/2 + diamAuto/2) + margen -(100/2), modelo.getColumnaJugador()*escala - (anchoCalle/2 + diamAuto/2) + margen
				-(100/2) , diamAuto+100,diamAuto +100 );
		g2d.drawOval(modelo.getFilaJugador()*escala - (anchoCalle/2 + diamAuto/2) + margen -(grosor/2), modelo.getColumnaJugador()*escala - (anchoCalle/2 + diamAuto/2) + margen
				-(grosor/2) , diamAuto+grosor,diamAuto +grosor );
		grosor = grosor +40;
		}		
		
		g2d.setColor(Color.WHITE);
		g2d.fillRect(ancho*escala + margen - 30,0,1000,1000);
		g2d.fillRect(0,alto*escala + margen - 30,ancho*escala + margen - 30,1000);
	}

	
	

}
